package com.yehongyu.mytools.ui.awt;

//: DynamicEvents.java
//The new Java 1.1 event model allows you to
//change event behavior dynamically. Also
//demonstrates multiple actions for an event.
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;

public class DynamicEvents extends Frame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	Vector<ActionListener> v = new Vector<ActionListener>();

	int i = 0;

	Button b1 = new Button("Button 1"), b2 = new Button("Button 2");

	public DynamicEvents() {
		setLayout(new FlowLayout());
		b1.addActionListener(new B());
		b1.addActionListener(new B1());
		b2.addActionListener(new B());
		b2.addActionListener(new B2());
		add(b1);
		add(b2);
	}

	class B implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			System.out.println("A button was pressed");
		}
	}

	class CountListener implements ActionListener {
		int index;

		public CountListener(int i) {
			index = i;
		}

		public void actionPerformed(ActionEvent e) {
			System.out.println("Counted Listener " + index);
		}
	}

	class B1 implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			System.out.println("Button 1 pressed");
			ActionListener a = new CountListener(i++);
			v.addElement(a);
			b2.addActionListener(a);
		}
	}

	class B2 implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			System.out.println("Button 2 pressed");
			int end = v.size() - 1;
			if (end >= 0) {
				b2.removeActionListener((ActionListener) v.elementAt(end));
				v.removeElementAt(end);
			}
		}
	}

	public static void main(String[] args) {
		Frame f = new DynamicEvents();
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		f.setSize(300, 200);
		f.setVisible(true);
	}
} // /:~

